<?php

namespace App\Http\Controllers;


use App\Article;
use Illuminate\Http\Request;

use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
use QL\QueryList;

class ArticleController extends Controller
{
    // 不需要require 需要use

    /**
     * 采集数据
     */
    public function queryList(){
        // 采集的地址 querylist采集列表 是需要使用rules和range
        $url = 'https://www.haodf.com/citiao/jibing-shimian.html?p=3';

        # 切割的区域
        $range = '#js-list .h-article';

        $rule = [
            'title' => ['.h-a-title h2','text'],
            'desc' => ['.h-a-content','text'],
            'author' => ['.h-a-tips', 'text'],
        ];

        $data = QueryList::get($url)->rules($rule)->range($range)->queryData();

        $result = Article::insert($data);
        # 记录日志
        Log::info("采集成功");
    }

    /**
     * 文章列表
     * @param Request $request
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Foundation\Application|\Illuminate\View\View|\think\response\View
     */
    public function list(Request $request){

//        搜索条件
        $title = $request->get('title');
        $where = [];
        if (!empty($title)) {
            $where[] = [
                'title','like',"%$title%"
            ];
        }

        # 先查询redis里面是否有数据
//        13.管理员信息列表展示，先查询Redis缓存，将Redis中数据进行展示（5分）
//        14.Redis中没有数据时，查询MySQL数据后存入Redis，下次查询时读取Redis缓存数据（5分）
//        Redis使用正确，效果演示正确，无BUG（5分）
        # 最简单的操作
        $page = \request()->get('page');
        $cache_data = Redis::get('page_'.$page);
        if (empty($cache_data)) {
            # Redis中没有数据时，查询MySQL数据后存入Redis，下次查询时读取Redis缓存数据
            $list = Article::where($where)->paginate(5);
            #存到redis里面
            Redis::set('page_'.$page,serialize($list));
        } else {
            $list = unserialize($cache_data);
        }

        return  view('article-list',['list' => $list,'title' => $title]);
    }

    /**
     * 文章详情静态页面
     */
    public function detail(Request $request){
        // 开发页面静态化
        $id  = $request->get('id');
        $filename = storage_path().'/html/'.$id.'.html';
        $redis_key = 'article_detail_'.$id;// 详细数据的键
        $zSet_name = 'article_read';// 有序集合存储阅读量
        # 第三次 第三次及以后访问详情页面时，直接读取纯静态文件（
        if (file_exists($filename)) {
            # 判断有效期 不再有效期内、重新查询数据、生成静态文件
            $create_at = filectime($filename);
            Redis::zincrby($zSet_name,1,$id); # 访问量加+1
            // 视图不需要解析直接变成静态文件
            if (time() - $create_at < 300) {
                $content = file_get_contents($filename);
                return  $content;
            }
        }

        #  第二次访问详情页面时，从redis中读取，并借助ob函数，生成纯静态文件
        $detail  =Redis::get($redis_key);
        if (!empty($detail)) {
            # redis 里面有详情的数据
            Redis::zincrby('article_read',1,$id); # 访问量加一
            $data =unserialize($detail);
           // 视图 、不直接展示视图页面

            $content = view('article-detail',['data' => $data]);
            // 获取视图内容
            $content = response($content)->getContent();
    //        静态文件放的位置、你可以自己选择规划
            file_put_contents($filename,$content);
            return $content;
        }

        # 查询数据之前、需要同步redis里面的阅读量到数据库
        $read = Redis::zscore($zSet_name,$id);
        Article::where('id',$id)->update(['read' => $read]);

        # 第一次访问详情页时，从mysql读取，然后将数据存入redis一份
        // 使用ORM查询数据
        $data = Article::find($id);

        # 第一次浏览 存储文件的阅读量、和详情的数据
        Redis::set($redis_key,serialize($data));
        Redis::zadd($zSet_name,$data->read,$id);

        return view('article-detail',['data' => $data]);

    }

    /**
     * 添加文章
     */
    public function add(){
        $title = \request()->post('title');
        $author = \request()->post('author');
        $desc = \request()->post('desc');
        $status = \request()->post('status');
        // 文件上传
        $image = \request()->file('image')->store('image');

        # 添加成功
        Article::create([
            'title' => $title,
            'author' => $author,
            'desc' => $desc,
            'status' => $status,
            'image' => $image,
        ]);
        # 记录日志
        Log::info('张三'."添加文章成功");
        return redirect('list');
    }

    /**
     * 编辑文章
     */
    public function editor(){

        # 如果请求是post修改数据
        if (\request()->method() == 'POST') {
            $id = \request()->post('id');
            # 判断是否修改图片
            if (\request()->hasFile('image')) {
                // 文件上传
                $image = \request()->file('image')->store('image');
            } else {
                $image = \request()->post('old_image');
            }

            $data = [
                'title' => \request()->post('title'),
                'author' => \request()->post('author'),
                'desc' => \request()->post('desc'),
                'image' => $image,
                'status' => \request()->post('status'),
            ];
            Article::where('id',$id)->update($data);

            Log::info("编辑成功");

            return redirect('list');
        } else {
//            get 请求展示数据
            $id = \request()->get('id');
            # 查询信息
            $articleInfo = Article::find($id);
            # 发送视图
            return view('article-editor',['info' => $articleInfo]);
            # 渲染数据
        }
    }

    /**
     * 删除数据
     */
    public function delete(){
        $id = \request()->get('id');

        # 删除缓存redis
        Redis::del('article_detail'.$id);

        Article::destroy($id);
        return redirect('list');
    }


    /**
     * laravel框架中使用redis
     */
    public function useRedis(){
        # 存储用户名
//        Redis::set('username','zhangsan');
//        Redis::hmset('username',15,'zhangsan');
        # 获取用户
        echo Redis::get('username');
    }

    /**
     * 修改文章状态
     */
    public function updateStatus(){
        $id = \request()->post('id');

        // 修改数据
        $info = Article::find($id);
        $info->status = $info->status == 1 ?  2 : 1;
        $info->save();
        return response()->json([
            'code' => 200,
            'msg' => 'ok',
            'data' => [],
        ]);
    }

    /**
     * 批量删除
     * @return \Illuminate\Http\JsonResponse
     */
    public function batchDelete(){
        $id = \request()->post('id');
        $id = explode(',',$id);//将字符串变成数组

        # 判断数据中是否有正常、有、不能删除

        $exist = Article::whereIn('id',$id)->where('status',1)->get();
        if ($exist) {
            # 如果有正常的数据、不能进行删除操作
            return response()->json([
                'code' => 2001,
                'msg' => '数据有正常的文章、不能删除',
                'data' => [],
            ]);
        }
        // 批量删除数据
        Article::destroy($id);

        # 清除缓存redis
        foreach ($id as $value ){
            Redis::del('article_detail'.$value);
        }

        return response()->json([
            'code' => 200,
            'msg' => 'ok',
            'data' => [],
        ]);
    }


    /**
     * 博客文章有关功能
     * 方法前缀article
     */

    public function articleList(){
        return view('/admin/article-list');
    }


}
